package kr.co.happenstance.util;

import java.io.*;
import java.text.*;
import java.util.*;

/**
 * 일반 Utility 클래스
 * @author Administrator
 *
 */
public class Util {
	/**
	 * 날짜 차이 - 일수
	 */
	public static final int DATE_DIFF_DAY = 0;
	
	/**
	 * 날짜 차이 - 시간
	 */
	public static final int DATE_DIFF_HOUR = 1;
	
	/**
	 * 날짜 차이 - 분
	 */
	public static final int DATE_DIFF_MIN = 2;
	
	/**
	 * 날짜 차이 - 초
	 */
	public static final int DATE_DIFF_SEC = 3;
	
	/**
	 * 배열 index값 가져오는 메소드
	 * 
	 * @param array
	 * @param value
	 * @return
	 */
	public static int getArrayIndex(String[] array, String value){
		int idx = -1;
		try{
			for(int i=0; i<array.length; i++){
				if(value.equals(array[i])){
					idx = i;
					break;
				}
			}
		}catch(Exception e){
			idx = -1;
		}
		return idx;
	}
	
	/**
	 * 배열 index값 가져오는 메소드
	 * 
	 * @param array
	 * @param value
	 * @return
	 */
	public static int getArrayIndex(int[] array, int value){
		int idx = -1;
		try{
			for(int i=0; i<array.length; i++){
				if(value == array[i]){
					idx = i;
					break;
				}
			}
		}catch(Exception e){
			idx = -1;
		}
		return idx;
	}	
	
	
	/**
	 * ArrayList<?> index값 가져오는 메소드<br><br>
	 * 
	 * ArrayList 요소 객체의 toString()값과 주어진 value값을 비교
	 * 
	 * 
	 * @param arrayList
	 * @param value
	 * @return
	 */
	public static int getArrayListIndex(ArrayList<?> arrayList, String value){
		int idx = 0;
		try{
			for(Object tmpVal: arrayList){
				if(tmpVal.toString().equals(value)){
					break;
				}
				idx++;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return idx;
	}	
	
	/**
	 * 주어진 문자열의 순서를 뒤집는 메소드
	 * 
	 * @param s
	 * @return
	 */
	public static String reverseString(String s) {
		return ( new StringBuffer(s) ).reverse().toString();
	 }	
	
	/**
	 * 파일 저장 메소드<br><br>
	 * 
	 * @param path
	 * @param name
	 * @param contents
	 * @param append
	 * @return
	 */
	public static boolean fileSave(String path, String name, byte[] contents, boolean append){
		boolean result = true;
		FileOutputStream fos = null;
		try{
			File filePath = new File(path);
			if(!filePath.exists()){
				filePath.mkdir();
			}
			
			fos = new FileOutputStream(new File(path+File.separator+name), append);
			fos.write(contents);
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(fos != null){
				try{
					fos.close();
				}catch(Exception e){}
				fos = null;
			}
		}
		return result;
	} 
	
	/**
	 * 파일 저장 메소드<br><br>
	 * 
	 * @param path
	 * @param name
	 * @param contents
	 * @param append
	 * @return
	 */
	public static boolean fileSave(String path, String name, String contents, boolean append){
		return fileSave(path, name, contents.getBytes(), append);
	}
	
	/**
	 * 파일 저장 메소드<br><br>
	 * 
	 * @param path
	 * @param name
	 * @param contents
	 * @return
	 */
	public static boolean fileSave(String path, String name, String contents){
		return fileSave(path, name, contents.getBytes(), true);
	}	
	
	/**
	 * 주어진 Calendar 객체를 주어진 포맷 맞는 문자열로 변환해서 리턴 하는 메소드
	 * 
	 * @param userDate
	 * @param formatString
	 * 
	 * @return 날짜 문자열
	 */
	public static String getDateFormat(Calendar userDate,String formatString){
		String dateString = "";
		try{
			SimpleDateFormat sdf = new SimpleDateFormat(formatString); 
			dateString = sdf.format(userDate.getTime());
		}catch(Exception e){
			e.printStackTrace();
		}
		return dateString;
	}	
	
	/**
	 * 현재 날짜를 주어진 포맷에 맞는 문자열로 변환해서 리턴 하는 메소드
	 * 
	 * @param formatString
	 * @return
	 */
	public static String getDateFormat(String formatString){
		return getDateFormat(Calendar.getInstance(), formatString);
	}	
	
	public static String getCurrencyFormat(int a){
		DecimalFormat df = new DecimalFormat("###,###.####");
		return df.format(a);
	}
	
	/**
	 * 두좌표간 거리 계산
	 * 
	 * @param lat1
	 * @param lon1
	 * @param lat2
	 * @param lon2
	 * @param unit
	 * @return
	 */
	public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
		double theta = lon1 - lon2;
		double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
		dist = Math.acos(dist);
		dist = rad2deg(dist);
		dist = dist * 60 * 1.1515;
		if (unit == 'K') {
			dist = dist * 1.609344;
		}else if (unit == 'N') {
			dist = dist * 0.8684;
		}
		return (dist);
	}
    
    public static double rad2deg(double rad) {
    	return (rad * 180.0 / Math.PI);
    }	
	
    public static double deg2rad(double deg) {
    	return (deg * Math.PI / 180.0);
    }    
    
    public static double round(double d, int n) {
        return Math.round(d * Math.pow(10, n)) / Math.pow(10, n);
     }    
    
	/**
	 * yyyy-MM-dd hh:mm:ss 형식의 문자열을 받아서 주어진 날짜로 셋팅된 Calendar 객체 리턴
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Calendar getCalendar(String dateStr) {
		Calendar cal = Calendar.getInstance();
		try{
			cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4)));
			cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(5, 7))-1);
			cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(8, 10)));
			cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dateStr.substring(11, 13)));
			cal.set(Calendar.MINUTE, Integer.parseInt(dateStr.substring(14, 16)));
			cal.set(Calendar.SECOND, Integer.parseInt(dateStr.substring(17, 19)));
		}catch(Exception e){
			e.printStackTrace();
		}
		return cal;
	}
	

	

	
	/**
	 * 두날짜 사이 간격
	 * 
	 * @param sMili
	 * @param eMill
	 * @param field
	 * @return
	 */
	public static long dateDiff(long sMili,long eMill, int field){
		long diff= 0;
		switch(field){
			case  DATE_DIFF_DAY:
				//날짜
				diff = (eMill - sMili) / 1000 / 60 / 60 / 24;
				break;
			case DATE_DIFF_HOUR:
				//시간
				diff = (eMill - sMili) / 1000 / 60 / 60;
				break;
			case DATE_DIFF_MIN:
				//분
				diff = (eMill - sMili) / 1000 / 60;
				break;
			case DATE_DIFF_SEC:
				//초
				diff = (eMill - sMili) / 1000;
				break;
		}
		
		return diff;		
	}
	/**
	 * 두날짜 사이 간격
	 * 
	 * @param sCal
	 * @param eCal
	 * @param field
	 * @return
	 */
	public static long dateDiff(Calendar sCal,Calendar eCal, int field){
		return dateDiff(eCal.getTime().getTime(), sCal.getTime().getTime(), field);
	}	
	
	/**
	 * 두날짜 사이 간격
	 * 
	 * @param sDateString
	 * @param eDateString
	 * @param field
	 * @return
	 */
	public static long dateDiff(String sDateString,String eDateString, int field){
		return dateDiff(getCalendar(sDateString), getCalendar(eDateString), field);
	}	
	
	
	
}
